#ifndef xpack_meta_invoke_type
#define xpack_meta_invoke_type
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::meta_invoke_type::inc
#include"define/base_type.hpp"
#include"macro/xexport.hpp"
#include"meta/is_func.hpp"
#include"meta/is_lambda.hpp"
#include"meta/remove_ptr.hpp"
#pragma pop_macro("xuser")

namespace mixc::meta_invoke_type{
    template<class call_t>
    inline auto invoke(){
        if constexpr (inc::is_lambda<call_t>){
            using lambda_t = decltype(& call_t::operator());
            return (lambda_t *)nullptr;
        }
        else if constexpr (inc::is_func<call_t>){
            return (call_t *)nullptr;
        }
        else{
            return voidp{};
        }
    }
}

namespace mixc::meta_invoke_type::origin{
    template<class func_t>
    using invoke_type = inc::remove_ptr<
        decltype(invoke<func_t>())
    >;
}

#endif

xexport_space(mixc::meta_invoke_type::origin)